package nl.hu.vakantievibes.client;

import nl.hu.vakantievibes.domain.Reis;
import nl.hu.vakantievibes.ui.CarpoolOpties;
import nl.hu.vakantievibes.ui.DetailsReizen;
import nl.hu.vakantievibes.ui.Inloggen;
import nl.hu.vakantievibes.ui.MijnBoekingen;
import nl.hu.vakantievibes.ui.MijnCarpools;
import nl.hu.vakantievibes.ui.NotificationManager;
import nl.hu.vakantievibes.ui.Registreer;
import nl.hu.vakantievibes.ui.ReisBoeken;
import nl.hu.vakantievibes.ui.ReisToevoegen;
import nl.hu.vakantievibes.ui.ShowReizen;
import nl.hu.vakantievibes.ui.UitnodigingenAccepteren;

import com.google.gwt.core.client.GWT;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.user.client.History;
import com.google.gwt.user.client.rpc.AsyncCallback;

public class HistoryListener {
	
	public HistoryListener() {
		String initToken = History.getToken();
		if(initToken.length() == 0) {
			History.newItem("allereizen");
		} else {
			historyChanged(initToken);
		}
		TheListener();
	}
	/*
	 * HistoryListener checkt de link (#foo) en wanneer dit een bekende pagina is, laad hij deze.
	 */
	private void TheListener() {
		History.addValueChangeHandler(new ValueChangeHandler<String>() {
			@Override
			public void onValueChange(ValueChangeEvent<String> event) {
				String token = History.getToken();
				historyChanged(token);				
			}
		});
		
		//History.fireCurrentHistoryState();
	}
	
	private void historyChanged(String token) {
		if(token.equals("login")) {
			if(!Systeem.get().loggedIn()) {
				Systeem.get().showPage(new Inloggen().createPage());
			} else {
				NotificationManager.get().createNotification("U bent reeds ingelogd.");
			}
		} else if(token.equals("register")) {
			if(!Systeem.get().loggedIn()) {
				Systeem.get().showPage(new Registreer().createPage());
			} else {
				NotificationManager.get().createNotification("U bent reeds ingelogd, en kan daarom geen nieuwe account registreren.");
			}
		} else if(token.equals("allereizen")) {
			Systeem.get().showPage(new ShowReizen().createPage());
		}else if(token.equals("mijnboekingen")) {
			if(Systeem.get().loggedIn()) {
				Systeem.get().showPage(new MijnBoekingen().createPage());
			} else {
				NotificationManager.get().createNotification("U moet eerst een account registreren, voordat u een reis boekt.");
				Systeem.get().showPage(new Registreer().createPage());
			}
		} else if(token.length() > 14 && token.substring(0,13).equals("boeking-autos")) {
			try {
				String tokenarr[] = token.split("-");
				CarpoolOpties(tokenarr[2], "auto");
			} catch(Exception e) { GWT.log(e.getMessage()); }
		}else if(token.length() > 22 && token.substring(0,21).equals("boeking-uitnodigingen")) {
			try {
				String tokenarr[] = token.split("-");
				CarpoolOpties(tokenarr[2], "uitN");
			} catch(Exception e) { GWT.log(e.getMessage()); }
		}else if(token.equals("mijncarpools")) {
			if(Systeem.get().loggedIn()) {
				Systeem.get().showPage(new MijnCarpools().createPage());
			} else {
				NotificationManager.get().createNotification("U moet eerst een account registreren, voordat u deze pagina kunt zien.");
				Systeem.get().showPage(new Registreer().createPage());
			}
		} else if(token.equals("reistoevoegen")) {
			if(Systeem.get().isAdmin()) {
				Systeem.get().showPage(new ReisToevoegen().createPage());
			} else {
				NotificationManager.get().createNotification("U heeft niet genoeg rechten om deze pagina te bekijken.");
			}
		} else if(token.length() > 12 && token.substring(0,10).equals("reisboeken")) {
			if(Systeem.get().loggedIn()) {
				try {
					String tokenarr[] = token.split("-");
					boekReis(tokenarr[1]);
				} catch(Exception e) { GWT.log(e.getMessage()); }
			} else {
				NotificationManager.get().createNotification("U moet eerst een account registreren, voordat u een reis boekt.");
				Systeem.get().showPage(new Registreer().createPage());
			}	
		} else if(token.length() > 13 && token.substring(0,11).equals("reisdetails")) {
			try {
				String tokenarr[] = token.split("-");
				zoekReis(tokenarr[1]);
			} catch(Exception e) { GWT.log(e.getMessage()); }
		} else {
			NotificationManager.get().createNotification("De gevraagde pagina is niet gevonden.");
			History.newItem("allereizen");
			Systeem.get().showPage(new ShowReizen().createPage());
		}
	}
	
	public void zoekReis(String naam) {
		AsyncCallback<Reis> callback = new AsyncCallback<Reis>() {
			@Override
			public void onFailure(Throwable caught) {
				NotificationManager.get().createNotification("Er is een fout opgetreden, excuses voor het ongemak.");
			}
			@Override
			public void onSuccess(Reis result) {
				if(result == null) {
					NotificationManager.get().createNotification("De gevraagde reis is niet gevonden in het systeem.");	
				} else {
					Systeem.get().showPage(new DetailsReizen().createPage(result));
				}
			}
		};
		new ServerCall().zoekReis(naam, callback);
	}
	
	public void CarpoolOpties(String naam, final String type) {
		AsyncCallback<Reis> callback = new AsyncCallback<Reis>() {
			@Override
			public void onFailure(Throwable caught) {
				NotificationManager.get().createNotification("Er is een fout opgetreden, excuses voor het ongemak.");
			}
			@Override
			public void onSuccess(Reis result) {
				if(result == null) {
					NotificationManager.get().createNotification("De gevraagde reis is niet gevonden in het systeem.");	
				} else {
					if(type.equals("uitN")) {
						Systeem.get().showPage(new UitnodigingenAccepteren().createPage());
					} else {
						Systeem.get().showPage(new CarpoolOpties().createPage(result, type));
					}
				}
			}
		};
		new ServerCall().zoekReis(naam, callback);
	}
	
	public void boekReis(String naam) {
		AsyncCallback<Reis> callback = new AsyncCallback<Reis>() {
			@Override
			public void onFailure(Throwable caught) {
				NotificationManager.get().createNotification("Er is een fout opgetreden, excuses voor het ongemak.");
			}
			@Override
			public void onSuccess(Reis result) {
				if(result == null) {
					NotificationManager.get().createNotification("De gevraagde reis is niet gevonden in het systeem.");	
				} else {
					Systeem.get().showPage(new ReisBoeken(result).createPage());
				}
			}
		};
		new ServerCall().zoekReis(naam, callback);
	}
}
